package Java8新日期时间API;

import org.junit.Test;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

/*
    瞬时(Instant) --> 类似于Date类
         Instant: 时间线上的一个瞬时点,这可能被用来记录应用程序中的事件时间戳
         在处理时间和日期的时候,通常会想到年、月、日、时、分、秒,但这只是时间的一个模型,
           是面向人类的,第二种通用模型是面向机器的,或者说是连续的,在此模型中,时间线中的一个点
           表示为一个很大的数,这有利于计算机处理,在UNIX中,这个数从1970年开始,以秒为的单位,
           同样的,在Java中,也是从1970年开始,但以毫秒为单位
         java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位,Instant表示
           时间线上的一点,而不需要任何上下文信息,例如:时区,概念上讲,它只是简单的表示自1970年1月1日0时
           0分0秒(UTC)开始的秒数,因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级
         1秒 = 1000毫秒 =10^6微秒=10^9纳秒

    常用API
        now(): 静态方法,返回默认UTC时区的Instant类的对象
        ofEpochMilli(long epochMilli): 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
        atOffset(ZoneOffset offset):  结合即时的偏移来创建一个 OffsetDateTime
        toEpochMilli(): 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
 */
public class DateTest02 {

    @Test
    public void test(){
        //实例化:获取本初子午线对应的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);

        //添加时间的偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);

        //返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳  --> 类似于Date类的getTime()方法
        long milli = instant.toEpochMilli();
        System.out.println(milli);

        //返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
        Instant nowInstant = Instant.ofEpochMilli(milli);
        System.out.println(nowInstant);
    }
}
